package com.dp.singleton;

/**
 * <p>Title: 饿汉式单例</p>
 * <p>Description:
 * @author 公众号：小白架构师养成记
 * @version 1.0
 * @date 2020/6/30
 */
public class HungrySingleton {

    /***
     * 该模式的特点是类一旦加载就创建一个单例，
     * 保证在调用 getInstance 方法之前单例已经存在了
     */
    private static final HungrySingleton instance = new HungrySingleton();

    private HungrySingleton() {}

    /***
     * 饿汉式单例在类创建的同时就已经创建好一个静态的对象供系统使用，
     * 以后不再改变，所以是线程安全的，可以直接用于多线程而不会出现问题
     * @return 当前对象
     */
    public static HungrySingleton getInstance() {
        return instance;
    }


    /****
     * 模拟多线程下并发测试
     * @param ags
     */
    public static void main(String[] ags){
        long start = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            new Thread(new Runnable() {
                public void run() {
                    HungrySingleton hungrySingleton = HungrySingleton.getInstance();
                    System.out.println(Thread.currentThread().getName() + hungrySingleton);
                }
            }).start();
        }
        long end = System.currentTimeMillis();
        System.out.println("总耗时：" + (end - start));
    }
}
